<?php

/***********************************************************************
 * 机房教学系统专用函数
 * @copyright Copyright (c) 2020 webyjh.
 * @author    webyjh@163.com
 * @version   1.0
 ************************************************************************/



//取客户端IP(考虑代理服务器)
function getIP()
{
    $ipSources = ['HTTP_X_FORWARDED_FOR', 'HTTP_CLIENT_IP', 'REMOTE_ADDR'];

    $realip = '0.0.0.0';
    foreach ($ipSources as $source) {
        if (isset($_SERVER[$source])) {
            if ($source === 'HTTP_X_FORWARDED_FOR') {
                $ips = explode(',', $_SERVER[$source]);
                $validIps = array_filter(array_map('trim', $ips), function ($ip) {
                    return $ip!== 'unknown' && filter_var($ip, FILTER_VALIDATE_IP);
                });
                if (!empty($validIps)) {
                    $realip = reset($validIps);
                    break;
                }
            } else {
                $ip = $_SERVER[$source];
                if (filter_var($ip, FILTER_VALIDATE_IP)) {
                    $realip = $ip;
                    break;
                }
            }
        }
    }

    return $realip;
}




// 隐藏真实地址，下载文件
function hideDownload($filename, $downLoadName = null)
{
    // 构建文件全路径
    $fullPath = PG_UP . $filename;
    // 若未指定下载文件名，使用完整路径文件名
    if ($downLoadName === null)         $downLoadName = basename($fullPath);
    // 检查文件是否存在
    if (!file_exists($fullPath))         return false;
    // 设置默认 MIME 类型
    $mime = 'application/octet-stream';
    // 设置响应头
    header('Content-Type: ' . $mime);
    header('Content-Disposition: attachment; filename="' . $downLoadName . '"');
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Pragma: no-cache');
    header('Content-Length: ' . filesize($fullPath));
    // 直接输出文件内容并终止脚本
    return readfile($fullPath);
}




// 把座位号小于100的,前面加0,生成整齐的3位数座位号
function longSite($site)
{
    return str_pad($site, 3, '0', STR_PAD_LEFT);
}


// 返回用IP的第4段，作为座位号,加前导0
function getSite()
{
    $ip = $_SERVER["REMOTE_ADDR"];
    if ($ip === '::1') {
        throw new Exception('ip error');
    }
    $site = explode('.', $ip)[3] ?? null;
    return $site!== null? str_pad($site, 3, '0', STR_PAD_LEFT) : null;
}



// //返回上课地点
function getRoom()
{
    // 获取客户端 IP 地址
    $ip = $_SERVER["REMOTE_ADDR"];

    // 验证 IP 地址是否为 IPv4 格式
    if (!filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) {
        throw new InvalidArgumentException('无效的 IPv4 地址');
    }

    // 检查是否为本地回环地址
    if ($ip === '::1') {
        throw new Exception('IP 错误：本地回环地址不适用');
    }

    // 分割 IP 地址为数组
    $ipParts = explode('.', $ip);

    // 获取配置中的上课地点信息
    $roomName = C('room');

    // 检查配置中是否存在对应的上课地点
    return $roomName[$ipParts[2]]?? '未知地点';
}



// 定义一个递归函数来添加文件夹及其内容到一个zip文件中
function addFolderToZip($folder, $zipArchive, $parentFolder = '') {
    $files = scandir($folder);
    foreach ($files as $file) {
        if ($file != '.' && $file != '..') {
            if (is_dir($folder . '/' . $file)) {
                // 如果是文件夹，递归调用该函数
                addFolderToZip($folder . '/' . $file, $zipArchive, $parentFolder . $file . '/');
            } else {
                // 如果是文件，添加到 ZIP 文件
                $zipArchive->addFile($folder . '/' . $file, $parentFolder . $file);
            }
        }
    }
}